Tensorlistsetitem

将输入的张量(item)替换到张量列表(TensorList)中指定索引位置。该算子创建一个新的张量列表,其中在指定索引位置的张量被替换为输入的新张量,而其他位置的张量保持不变。

该算子不区分具体的数据类型,通过copy_size参数指定每个张量的数据量大小。

输入:
  • in_data - 输入张量列表指针(void**类型),指向原始张量列表中的各个张量数据。

  • in_item - 输入张量指针(void*类型),表示要替换到张量列表中的新张量数据。

  • index - 要替换的张量在列表中的索引位置(int类型)。

  • tensorlist_size - 张量列表中包含的张量个数(int类型)。

  • copy_size - 每个张量的数据量大小数组(int*类型),以字节为单位,表示每个张量需要复制的字节数。

  • core_mask - 核掩码(int类型),仅共享存储版本需要。

输出:
  • out_data - 输出张量列表指针(void**类型),存储替换操作后的张量列表,其中index位置的张量被替换为in_item。

支持平台:

FT78NE MT7004

备注

  • 该算子不区分具体的数据类型,通过copy_size参数控制复制的字节数

  • 调用前需要确保out_data指向的内存空间足够大,能够存储所有张量数据

  • 索引index必须在有效范围内(0 <= index < tensorlist_size)

  • 算子会复制所有张量数据,输出张量列表与输入张量列表数据独立

共享存储版本:

void tensorlistsetitem_s(void **in_data, void *in_item, void **out_data, int index, int tensorlist_size, int *copy_size, int core_mask)

C调用示例(共享存储版本):

 1#include <stdio.h>
 2#include <tensorlistsetitem.h>
 3
 4int main(int argc, char* argv[]) {
 5    // 假设在DDR空间
 6    int tensorlist_size = 3;  // 张量列表包含3个张量
 7    int index = 1;  // 替换索引为1的张量
 8
 9    // 输入张量列表
10    float *in_tensor0 = (float *)0xA0000000;
11    float *in_tensor1 = (float *)0xA0010000;
12    float *in_tensor2 = (float *)0xA0020000;
13    void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
14
15    // 输入item
16    float *in_item = (float *)0xA0030000;
17
18    // 输出张量列表
19    float *out_tensor0 = (float *)0xB0000000;
20    float *out_tensor1 = (float *)0xB0010000;
21    float *out_tensor2 = (float *)0xB0020000;
22    void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
23
24    // 每个张量的数据量大小
25    int copy_size[3] = {40, 40, 40};
26
27    // 核掩码
28    int core_mask = 0xff;
29
30    // 调用共享存储版本的函数
31    tensorlistsetitem_s(in_data, in_item, out_data, index, tensorlist_size, copy_size, core_mask);
32
33    return 0;
34}

私有存储版本:

void tensorlistsetitem_p(void **in_data, void *in_item, void **out_data, int index, int tensorlist_size, int *copy_size)

C调用示例(私有存储版本):

 1#include <stdio.h>
 2#include <tensorlistsetitem.h>
 3
 4int main(int argc, char* argv[]) {
 5    // 假设在L2空间
 6    int tensorlist_size = 3;  // 张量列表包含3个张量
 7    int index = 1;  // 替换索引为1的张量
 8
 9    // 输入张量列表(假设已初始化)
10    float *in_tensor0 = (float *)0x10000000;  // 第一个张量
11    float *in_tensor1 = (float *)0x10001000;  // 第二个张量(将被替换)
12    float *in_tensor2 = (float *)0x10002000;  // 第三个张量
13    void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
14
15    // 输入item(新张量数据)
16    float *in_item = (float *)0x10003000;
17
18    // 输出张量列表(需要预先分配内存)
19    float *out_tensor0 = (float *)0x10004000;
20    float *out_tensor1 = (float *)0x10005000;
21    float *out_tensor2 = (float *)0x10006000;
22    void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
23
24    // 每个张量的数据量大小(假设每个张量有10个float元素,每个float 4字节)
25    int copy_size[3] = {40, 40, 40};  // 40字节 = 10 * 4
26
27    // 调用私有存储版本的函数
28    tensorlistsetitem_p(in_data, in_item, out_data, index, tensorlist_size, copy_size);
29
30    return 0;
31}